package main

import (
	"fmt"
	"reflect"
)

type Cat struct{}

func (*Cat) CatFunc(i int) {
	fmt.Println("you are calling the catFunc, value: ", i)
}

func main() {
	var car Cat
	call := reflect.ValueOf(&car).MethodByName("CatFunc").Call([]reflect.Value{reflect.ValueOf(3)})
	fmt.Println(call)
}

//在 Go 的反射包 (reflect) 中，reflect.Value 和 reflect.Type 是两个核心概念，用于不同的目的。以下是它们的区别和用途：
//
//reflect.Type
//reflect.Type 表示 Go 语言中的类型。它提供了关于类型本身的信息，比如类型的名称、种类、结构字段、方法等。它类似于类型的元数据。
//
//使用 reflect.Type 的示例

//package main
//
//import (
//"fmt"
//"reflect"
//)
//
//type MyStruct struct {
//	Name string
//	Age  int
//}
//
//func main() {
//	var x MyStruct
//
//	// 获取变量 x 的类型
//	t := reflect.TypeOf(x)
//
//	fmt.Println("Type:", t.Name())          // 输出: MyStruct
//	fmt.Println("Kind:", t.Kind())          // 输出: struct
//
//	// 获取结构体的字段信息
//	for i := 0; i < t.NumField(); i++ {
//		field := t.Field(i)
//		fmt.Println("Field Name:", field.Name, "Field Type:", field.Type)
//	}
//}
//reflect.Value
//reflect.Value 表示一个具体的值，它不仅包含类型信息，还包含实际的值本身。通过 reflect.Value，你可以获取和修改实际的值。
//
//使用 reflect.Value 的示例
//go
//复制代码
//package main
//
//import (
//"fmt"
//"reflect"
//)
//
//type MyStruct struct {
//	Name string
//	Age  int
//}
//
//func main() {
//	x := MyStruct{Name: "Alice", Age: 30}
//
//	// 获取变量 x 的值
//	v := reflect.ValueOf(x)
//
//	fmt.Println("Value:", v)                  // 输出: {Alice 30}
//	fmt.Println("Type:", v.Type())            // 输出: MyStruct
//	fmt.Println("Kind:", v.Kind())            // 输出: struct
//
//	// 获取结构体的字段值
//	nameField := v.FieldByName("Name")
//	ageField := v.FieldByName("Age")
//	fmt.Println("Name:", nameField.String())  // 输出: Alice
//	fmt.Println("Age:", ageField.Int())       // 输出: 30
//
//	// 修改字段值 (需要使用指针)
//	vPtr := reflect.ValueOf(&x).Elem()
//	vPtr.FieldByName("Name").SetString("Bob")
//	vPtr.FieldByName("Age").SetInt(25)
//	fmt.Println("Modified Value:", x)         // 输出: {Bob 25}
//}
//区别总结
//reflect.Type:
//
//代表一个类型。
//提供类型的名称、种类、字段、方法等信息。
//主要用于获取类型的元数据。
//reflect.Value:
//
//代表一个具体的值。
//提供对值的获取和修改操作。
//需要类型和值的结合。
//在实际使用中，reflect.Type 常用于需要了解类型结构和方法的信息时，而 reflect.Value 则用于实际操作变量的值，例如获取和修改字段值。
